﻿/*
Nombre:                         TitularDao
Descripcion:                    Implementacion que maneja las funciones principales sobre los titulares manejados en la capa de persistencia
Dependencias:                 
Fecha de creación:              20081206
Autor:                          VMORALES
Fecha de modifcación:         
Responsable:                  
Num. de modifcación:            0
*/

#region Imports

using Electrocucaracha.AdminPersonal.DAO.Entidades;
using Electrocucaracha.AdminPersonal.DAO.Acciones;
using System;

#endregion

namespace Electrocucaracha.AdminPersonal.DAO
{
    /// <summary>
    /// Implementacion que maneja las funciones principales sobre los titulares manejados en la capa de persistencia              
    /// </summary>
    public class TitularDao : BaseDao, ITitularDao
    {
        #region Constantes

        #endregion

        #region Miembros

        private static TitularDao instancia = new TitularDao();

        #endregion

        #region Propiedades

        public static TitularDao Instancia
        {
            get
            {
                if (instancia == null)
                {
                    instancia = new TitularDao();
                }
                return instancia;
            }
        }//Instancia

        #endregion

        #region Constructores

        private TitularDao()
            : base()
        {
        }//TitularDao

        #endregion

        #region Funciones

        #endregion

        #region ITitularDao

        /// <summary>
        /// Funcion que devuelve todos los titulares que comparten nombres y apellidos capturados en la capa de persistencia
        /// </summary>
        /// <param name="nombres">Nombres de los titulares</param>
        /// <param name="apellidoPaterno">Apellidos paternos de los titulares</param>
        /// <param name="apellidoMaterno">Apellidos maternos de los titulares</param>
        /// <returns></returns>
        public TitularDTO[] Obtener(string nombres, string apellidoPaterno, string apellidoMaterno) 
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.OBTENER_POR_DATOS_SIMILARES);
            accion.Parametros[Accion.INPUT] = new TitularDTO() { 
                Nombres = nombres,
                ApellidoPaterno = apellidoPaterno,
                ApellidoMaterno = apellidoMaterno
            };

            admin.Ejecutar(accion);

            return (TitularDTO[])accion.Parametros[Accion.OUTPUT];
        }//Obtener

        #endregion

        #region IGenericoDao

        /// <summary>
        /// Funcion que agrega un objeto de tipo titular a la capa de persistencia
        /// </summary>
        /// <param name="titular">Objeto a ser agregado a la capa de persistencia</param>
        /// <returns>Verdadero en caso de exito en la insercion del objeto falso en caso contrario</returns>
        public bool Agregar(ref TitularDTO titular)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.AGREGAR);
            accion.Parametros[Accion.INPUT] = titular;
            accion.Parametros[Accion.OUTPUT] = false;
            if (!this.Existe(titular))
            {
                admin.Ejecutar(accion);
            }
            else if (this.Obtener(titular.Nombres, titular.ApellidoPaterno, titular.ApellidoMaterno) != null)
            {
                accion.Parametros[Accion.OUTPUT] = this.Activar(titular);
            }

            admin.Ejecutar(accion);

            return (bool)accion.Parametros[Accion.OUTPUT];
        }//Agregar

        /// <summary>
        /// Funcion que agrega un conjunto de objetos de tipo titular a la capa de persistencia
        /// </summary>
        /// <param name="titulares">Conjunto de objetos de tipo titular a ser agregados</param>
        /// <returns>El indice del ultimo titular el cual fue agregado con exito a la capa de persistencia</returns>
        public int Agregar(ref TitularDTO[] titulares)
        {
            int i = 0;
            for (; i < titulares.Length; i++)
            {
                if (!Agregar(ref titulares[i]))
                    break;
            }
            return i;
        }//Agregar

        /// <summary>
        /// Funcion que elimina(en caso de existir) un objeto de tipo titular de la capa de persistencia
        /// </summary>
        /// <param name="titular">Objeto a ser eliminado</param>
        /// <returns>Verdadero en caso de eliminacion falso en caso contrario</returns>
        public bool Eliminar(TitularDTO titular)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.ELIMINAR);
            accion.Parametros[Accion.INPUT] = titular;
            if (Existe(titular))
            {
                admin.Ejecutar(accion);
            }

            return (bool)accion.Parametros[Accion.OUTPUT];
        }//Eliminar

        /// <summary>
        /// Funcion que elimina(en caso de existir) un conjunto de objetos de tipo titular de la capa de persistencia
        /// </summary>
        /// <param name="titulares">Conjunto de objetos a ser eliminados</param>
        /// <returns>El indice del ultimo titular el cual fue eliminado con exito a la capa de persistencia</returns>
        public int Eliminar(TitularDTO[] titulares)
        {
            int i = 0;
            for (; i < titulares.Length; i++)
            {
                if (!Eliminar(titulares[i]))
                    break;
            }
            return i;
        }//Eliminar

        /// <summary>
        /// Funcion que obtiene un titular, de la capa de persistencia, a partir de su identificador
        /// </summary>
        /// <param name="id">Identificador del titular a obtener</param>
        /// <returns>Un titular en caso de encontrarlo nulo en caso contrario</returns>
        public TitularDTO Obtener(int id)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.OBTENER);
            accion.Parametros[Accion.INPUT] = id;
            admin.Ejecutar(accion);

            return (TitularDTO) accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que devuelve todos los titulares registrados en la capa de persistencia
        /// </summary>
        /// <returns>Conjunto de titulares</returns>
        public TitularDTO[] Obtener()
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.OBTENER_TODOS);
            admin.Ejecutar(accion);

            return (TitularDTO[])accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que actualiza sobre la capa de persistencia un titular especifico
        /// </summary>
        /// <param name="titular">Titular a sobrescribir datos de la entidad ubicada en la capa de persistencia</param>
        /// <returns>Verdadero en caso de su correcta actualizacion</returns>
        public bool Actualizar(TitularDTO titular)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.ACTUALIZAR);
            accion.Parametros[Accion.INPUT] = titular;
            if (Existe(titular))
            {
                admin.Ejecutar(accion);
                return (bool)accion.Parametros[Accion.OUTPUT];
            }
            return false;
        }//Actualizar

        /// <summary>
        /// Funcion que actualiza en la capa de persistencia un conjunto de titulares
        /// </summary>
        /// <param name="titulares">Conjunto de titulares a actualizar en la capa de persistencia</param>
        /// <returns>El indice del ultimo titular el cual fue actualizado con exito a la capa de persistencia</returns>
        public int Actualizar(TitularDTO[] titulares)
        {
            int i = 0;
            for (; i < titulares.Length; i++)
            {
                if (!Actualizar(titulares[i]))
                    break;
            }
            return i;
        }//Actualizar

        /// <summary>
        /// Funcion que determina si el objeto actualmente se encuentra registrado en la capa de persistencia
        /// </summary>
        /// <param name="titular">Objeto a validar su existencia</param>
        /// <returns>Verdadero en caso de existir falso en caso contrario</returns>
        public bool Existe(TitularDTO titular)
        {
            bool existe = this.Obtener(titular.Id) != null;
            if (!existe)
            {
                existe = this.Obtener(titular.Nombres, titular.ApellidoPaterno, titular.ApellidoMaterno) == null;
            }
            return existe;
        }//Existe

        /// <summary>
        /// Funcion que devuelve la cantidad de titulares registrados en la capa de persistencia
        /// </summary>
        /// <returns>Cantidad de titulares registrados</returns>
        public int ObtenerCantidad()
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.OBTENER_CANTIDAD);
            admin.Ejecutar(accion);

            return (int)accion.Parametros[Accion.OUTPUT];
        }//ObtenerCantidad

        /// <summary>
        /// Funcion que resetea el identificador del catalogo de categia cero
        /// </summary>
        public void ResetearId()
        {
            admin.Ejecutar(admin.ObtenerAccion(CatalogoAcciones.Titular.RESETEAR_ID));
        }//ResetearId

        /// <summary>
        /// Funcion que valida los campos correctos del objeto
        /// </summary>
        /// <param name="banco">Objeto a ser validado</param>
        /// <param name="validacion">Opciones de validacion de los campos</param>
        public void Validar(TitularDTO titular, Validaciones validacion)
        {
        }//Validar

        /// <summary>
        /// Funcion que valida los campos correctos del objeto
        /// </summary>
        /// <param name="banco">Objeto a ser validado</param>
        /// <param name="validacion">Opciones de validacion de los campos</param>
        public void Validar(TitularDTO[] titulares, Validaciones validacion)
        {
        }//Validar


        #endregion

        #region IActivo

        /// <summary>
        /// Funcion que devuelve todos los objetos con estatus de activo de la capa de persistencia
        /// </summary>
        /// <returns>Conjunto de objetos con el mismo estatus de activo</returns>
        public TitularDTO[] ObtenerActivos()
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.OBTENER_ACTIVOS);
            admin.Ejecutar(accion);

            return (TitularDTO[])accion.Parametros[Accion.OUTPUT];
        }//ObtenerActivos

        /// <summary>
        /// Funcion que devuelve todos los objetos con estatus de inactivo de la capa de persistencia
        /// </summary>
        /// <returns>Conjunto de objetos con el mismo estatus de inactivo</returns>
        public TitularDTO[] ObtenerInactivos()
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Titular.OBTENER_INACTIVOS);
            admin.Ejecutar(accion);

            return (TitularDTO[])accion.Parametros[Accion.OUTPUT];
        }//ObtenerInactivos

        /// <summary>
        /// Funcion que actualiza el estatus a activo del titular en la capa de persistencia
        /// </summary>
        /// <param name="titularInactivo">Objeto con el estatus a actualizar</param>
        /// <returns>Verdadero en caso de exito falso en caso contrario</returns>
        public bool Activar(TitularDTO titularInactivo)
        {
            bool resultado = false;
            if (titularInactivo.Activo)
            {
                resultado = true;
            }
            else
            {
                titularInactivo.Activo = true;
                resultado = Actualizar(titularInactivo);
            }

            return resultado;
        }//Activar

        /// <summary>
        /// Funcion que actualiza el estatus a desactivo del titular en la capa de persistencia
        /// </summary>
        /// <param name="titularActivo">Objeto con el estatus a actualizar</param>
        /// <returns>Verdadero en caso de exito falso en caso contrario</returns>
        public bool Desactivar(TitularDTO titularActivo)
        {
            bool resultado = false;
            if (!titularActivo.Activo)
            {
                resultado = true;
            }
            else
            {
                titularActivo.Activo = false;
                resultado = Actualizar(titularActivo);
            }

            return resultado;
        }//Desactivar

        #endregion
    }//TitularDao
}//Electrocucaracha.AdminPersonal.DAO